串口接收开始时正常,过一段时间接收不到任何数,其他程序正常,没有死机

您所在的位置:网站首页 win7 hal丢失 串口接收开始时正常,过一段时间接收不到任何数,其他程序正常,没有死机

串口接收开始时正常,过一段时间接收不到任何数,其他程序正常,没有死机

2024-01-18 00:58| 来源: 网络整理| 查看: 265

在初始化后,如果曾经接收正常过,说明你的基础配置是没有问题的,过一段时间后收不到任何数,并且你的程序还在跑,并没有硬件错误之类的,这种情况一般是数据量太大导致了串口的过载宕机。

如何确定你的串口是否过载宕机了?连接你的单片机进入仿真,peripherals->system view->USART里选择你的当前可能宕机的串口号,则会出现该串口的寄存器,在新出现的页卡里找到ISR寄存器展开,往下翻找到ORE,看是否被打上了√,当发生串口过载错误时,就会出现此现象。

给一个简单直接的解决办法,大家可以用这个办法为基础,自己依据需求变化:

利用你程序里已经开的定时器,周期不用太长或者太短,1秒钟-1分钟都可以,只要你能接受,直接判断ORE是否被置位,判断ORE的方法如下:

标准库查询函数USART_GetITStatus(USARTx, USART_IT_ORE)

hal库查询函数__HAL_UART_GET_FLAG(&huart1,UART_FLAG_ORE);

如果查询判断结果是1,直接重新初始化对应的串口。初始化串口的函数不用我罗列了,就是程序一开始调用的那个,usart1_init()什么的,hal库有自己生成的init,重新调用一下,那么串口就会重新启动了。

下面贴了hal库的解决方法,以串口2为例,标准库也类似,甚至标准库的初始化更简单直接将main开始的串口初始化函数再调用一遍即可。

//清理ORE的标志位 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF); //可能需要在这插入 //如果你存储过初始化的数据,并且不想修改,直接重新初始化串口2 HAL_UART_Init(huart2); //如果有你想修改,或者之前没有初始化的话,需要将下面的一段放到上面的插入处 huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1; huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_SetTxFifoThreshold(&huart2, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_SetRxFifoThreshold(&huart2, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_DisableFifoMode(&huart2) != HAL_OK) { Error_Handler(); }

就是这么简单。

如果对你有用的话,留个言或者点个赞吧~



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3